/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package tablero;

import com.supareno.pgnparser.jaxb.Hits;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.ListIterator;

public class ManejoBD {
    
    private Connection conexion;
    
    public ManejoBD() {
        conexion = null;
        
    }
    
    public int agregaPartida(HashMap partida) {
        int numeroPartida = 0, Id_Eco, Id_Evento, Id_Sitio, blancoElo, negroElo, blanco, negro;
        
        
        String nombreEvento, nombreSitio, eco, nombreBlanco, nombreNegro, nombrePartida, fecha, resultado, ronda;
        
        nombreEvento = (String) partida.get(Constantes.ETIQUETA_EVENTO);
        nombreSitio = (String) partida.get(Constantes.ETIQUETA_SITIO);
        eco = (String) partida.get(Constantes.ETIQUETA_ECO);
        nombreBlanco = (String) partida.get(Constantes.ETIQUETA_JUGADOR_BLANCO);
        nombreNegro = (String) partida.get(Constantes.ETIQUETA_JUGADOR_NEGRO);
        blancoElo = Integer.parseInt((String) partida.get(Constantes.ETIQUETA_JUGADOR_BLANCO_ELO));
        negroElo = Integer.parseInt((String) partida.get(Constantes.ETIQUETA_JUGADOR_NEGRO_ELO));
        nombrePartida = (String) partida.get(Constantes.NOMBRE_PARTIDA);
        ronda = (String) partida.get(Constantes.ETIQUETA_RONDA);
        fecha = (String) partida.get(Constantes.ETIQUETA_FECHA);
        resultado = (String) partida.get(Constantes.ETIQUETA_RESULTADO);
        
        try {
            
            ResultSet result = null;
            PreparedStatement instruccionPartida = conexion.prepareStatement(
                    Constantes.INSERCION_PARTIDA_SIN_NOMBRE,
                    Statement.RETURN_GENERATED_KEYS);
            
            agregaEvento(nombreEvento);
            agregaSitio(nombreSitio);
            agregaEco(eco);
            agregaJugador(nombreBlanco, blancoElo);
            agregaJugador(nombreNegro, negroElo);
            
            Id_Evento = seleccionaEvento(nombreEvento);
            Id_Sitio = seleccionaSitio(nombreSitio);
            Id_Eco = seleccionaEco(eco);
            blanco = seleccionaJugador(nombreBlanco);
            negro = seleccionaJugador(nombreNegro);
            
            
            instruccionPartida.setString(1, nombrePartida);
            instruccionPartida.setInt(2, Id_Evento);
            instruccionPartida.setInt(3, Id_Sitio);
            instruccionPartida.setString(4, fecha);
            instruccionPartida.setString(5, ronda);
            instruccionPartida.setInt(6, blanco);
            instruccionPartida.setInt(7, negro);
            instruccionPartida.setString(8, resultado);
            instruccionPartida.setInt(9, Id_Eco);
            
            instruccionPartida.executeUpdate();
            
            result = instruccionPartida.getGeneratedKeys();
            if (result != null && result.next()) {
                numeroPartida = result.getInt(1);
                
                
            }
            
            instruccionPartida.close();
            
            
        } catch (Exception ex) {
            System.out.println(ex + Constantes.ERROR_CARGAR_PARTIDAS);
        }
        return numeroPartida;
    }
    
    public void agregaMovimiento(ArrayList listaMovimiento) {
        PreparedStatement instruccion = null;
        try {
            
            conexion.setAutoCommit(false);
            instruccion = conexion.prepareStatement(Constantes.INSERCION_MOVIMIENTO);
            
            ListIterator<HashMap> iteradorMovimientos = listaMovimiento.listIterator();
            
            while (iteradorMovimientos.hasNext()) {
                HashMap movimiento = iteradorMovimientos.next();
                instruccion.setInt(1, (Integer) movimiento.get(Constantes.ID_MOVIMIENTO));
                instruccion.setInt(2, (Integer) movimiento.get(Constantes.ID_PARTIDA));
                instruccion.setString(3, (String) movimiento.get(Constantes.FICHA));
                instruccion.setString(4, (String) movimiento.get(Constantes.POS_INICIAL));
                instruccion.setString(5, (String) movimiento.get(Constantes.POS_FINAL));
                instruccion.setString(6, (String) movimiento.get(Constantes.COMENTARIO));
                instruccion.addBatch();
            }
            
            instruccion.executeBatch();
            conexion.commit();
            
            
        } catch (Exception ex) {
            System.out.println(ex);
        } finally {
            
            if (instruccion != null) {
                try {
                    instruccion.close();
                } catch (SQLException sqlEx) {
                } // ignore

                instruccion = null;
            }
        }
        
    }
    
    public void conectarBD() {
        conexion = ConexionBD.getConnection();
    }
    
    public void agregaEvento(String evento) {
        PreparedStatement instruccion = null;
        try {
            
            instruccion = conexion.prepareStatement(Constantes.INSERCION_EVENTO);
            instruccion.setString(1, evento);
            instruccion.executeUpdate();
        } catch (Exception ex) {
            System.out.println(ex);
        } finally {
            
            if (instruccion != null) {
                try {
                    instruccion.close();
                } catch (SQLException sqlEx) {
                } // ignore

                instruccion = null;
            }
        }
    }
    
    public void agregaSitio(String sitio) {
        PreparedStatement instruccion = null;
        try {
            
            instruccion = conexion.prepareStatement(Constantes.INSERCION_SITIO);
            instruccion.setString(1, sitio);
            instruccion.executeUpdate();
        } catch (Exception ex) {
            System.out.println(ex);
        } finally {
            
            if (instruccion != null) {
                try {
                    instruccion.close();
                } catch (SQLException sqlEx) {
                } // ignore

                instruccion = null;
            }
        }
    }
    
    public void agregaEco(String eco) {
        PreparedStatement instruccion = null;
        try {
            
            instruccion = conexion.prepareStatement(Constantes.INSERCION_ECO);
            instruccion.setString(1, eco);
            instruccion.executeUpdate();
        } catch (Exception ex) {
            System.out.println(ex);
        } finally {
            
            if (instruccion != null) {
                try {
                    instruccion.close();
                } catch (SQLException sqlEx) {
                } // ignore

                instruccion = null;
            }
        }
    }
    
    public void agregaJugador(String jugador, int elo) {
        PreparedStatement instruccion = null;
        try {
            
            instruccion = conexion.prepareStatement(Constantes.INSERCION_JUGADOR);
            instruccion.setString(1, jugador);
            instruccion.setInt(2, elo);
            instruccion.executeUpdate();
        } catch (Exception ex) {
            System.out.println(ex);
        } finally {
            
            if (instruccion != null) {
                try {
                    instruccion.close();
                } catch (SQLException sqlEx) {
                } // ignore

                instruccion = null;
            }
        }
    }
    
    public int seleccionaEvento(String evento) {
        PreparedStatement instruccion = null;
        int eventoId = 0;
        
        try {
            
            instruccion = conexion.prepareStatement(Constantes.SELECCIONA_EVENTO);
            
            instruccion.setString(1, evento);
            ResultSet result = instruccion.executeQuery();
            
            while (result.next()) {
                eventoId = result.getInt(1);
            }
        } catch (Exception ex) {
            System.out.println(ex);
        } finally {
            
            if (instruccion != null) {
                try {
                    instruccion.close();
                } catch (SQLException sqlEx) {
                } // ignore

                instruccion = null;
            }
        }
        return eventoId;
    }
    
    public int seleccionaSitio(String sitio) {
        PreparedStatement instruccion = null;
        int sitioId = 0;
        
        try {
            
            instruccion = conexion.prepareStatement(Constantes.SELECCIONA_SITIO);
            
            instruccion.setString(1, sitio);
            ResultSet result = instruccion.executeQuery();
            
            while (result.next()) {
                sitioId = result.getInt(1);
            }
        } catch (Exception ex) {
            System.out.println(ex);
        } finally {
            
            if (instruccion != null) {
                try {
                    instruccion.close();
                } catch (SQLException sqlEx) {
                } // ignore

                instruccion = null;
            }
        }
        return sitioId;
    }
    
    public int seleccionaEco(String eco) {
        PreparedStatement instruccion = null;
        int ecoId = 0;
        
        try {
            
            instruccion = conexion.prepareStatement(Constantes.SELECCIONA_ECO);
            
            instruccion.setString(1, eco);
            ResultSet result = instruccion.executeQuery();
            
            while (result.next()) {
                ecoId = result.getInt(1);
            }
        } catch (Exception ex) {
            System.out.println(ex);
        } finally {
            
            if (instruccion != null) {
                try {
                    instruccion.close();
                } catch (SQLException sqlEx) {
                } // ignore

                instruccion = null;
            }
        }
        return ecoId;
    }
    
    public int seleccionaJugador(String nombre) {
        PreparedStatement instruccion = null;
        int jugador = 0;
        
        try {
            
            instruccion = conexion.prepareStatement(Constantes.SELECCIONA_JUGADOR);
            
            instruccion.setString(1, nombre);
            ResultSet result = instruccion.executeQuery();
            
            while (result.next()) {
                jugador = result.getInt(1);
                
            }
        } catch (Exception ex) {
            System.out.println(ex);
        } finally {
            
            if (instruccion != null) {
                try {
                    instruccion.close();
                } catch (SQLException sqlEx) {
                } // ignore

                instruccion = null;
            }
        }
        return jugador;
    }
    
    public List<Game> seleccionaPartida(int idEvento, int idSitio, String año, int idJugadorBlanco, int idJugadorNegro, int eco) {
        PreparedStatement instruccion = null;
        List<Game> listaJuegos = new ArrayList<Game>();
        String query = Constantes.SELECCIONA_PARTIDA;
        int contador = 0;
        
        try {
            
            if (idEvento != 0) {
                query = query.concat("Id_Evento=" + idEvento);
                contador++;
            }
            if (idSitio != 0) {
                if (contador > 0) {
                    query = query.concat(" and Id_Sitio=" + idSitio);
                } else {
                    query = query.concat(" Id_Sitio=" + idSitio);
                }
                contador++;
            }
            if (!año.equals("")) {
                if (contador > 0) {
                    query = query.concat(" and YEAR(Fecha)=" + año);
                } else {
                    query = query.concat(" YEAR(Fecha)=" + año);
                }
                contador++;
            }
            
            if (idJugadorBlanco != 0) {
                if (contador > 0) {
                    query = query.concat(" and Id_Blanco=" + idJugadorBlanco);
                } else {
                    query = query.concat("  Id_Blanco=" + idJugadorBlanco);
                }
                contador++;
            }
            if (idJugadorNegro != 0) {
                if (contador > 0) {
                    query = query.concat(" and Id_Negro=" + idJugadorNegro);
                } else {
                    query = query.concat("  Id_Negro=" + idJugadorNegro);
                }
                contador++;
            }
            if (eco != 0) {
                if (contador > 0) {
                    query = query.concat(" and Id_ECO=" + eco);
                } else {
                    query = query.concat("  Id_ECO=" + eco);
                }
                contador++;
            }
            
            query = query.concat(";");
            
            instruccion = conexion.prepareStatement(query);
            
            ResultSet result = instruccion.executeQuery();
            int idPartida;
            String fecha, ronda, resultado;
            while (result.next()) {
                idPartida = result.getInt(1);
                fecha = result.getDate(2).toString();
                ronda = result.getString(3);
                resultado = result.getString(4);
                
                Game juego = new Game();
                
                juego.setEvent(seleccionaNombreEvento(idEvento));
                juego.setSite(seleccionaNombreSitio(idSitio));
                juego.setDate(fecha);
                juego.setRound(ronda);
                juego.setResult(resultado);
                juego.setEco(seleccionaEco(eco));
                juego.setBlack(seleccionaNombreEvento(idJugadorNegro));
                juego.setWhite(seleccionaNombreEvento(idJugadorBlanco));
                juego.setWhiteElo(seleccionaElo(idJugadorBlanco) + "");
                juego.setBlackElo(seleccionaElo(idJugadorBlanco) + "");
                
                juego.setHits(seleccionaMovimientos(idPartida));
                listaJuegos.add(juego);
            }
        } catch (Exception ex) {
            System.out.println(ex);
        } finally {
            
            if (instruccion != null) {
                try {
                    instruccion.close();
                } catch (SQLException sqlEx) {
                } // ignore

                instruccion = null;
            }
        }
        return listaJuegos;
    }
    
    public String seleccionaNombreEvento(int idEvento) {
        PreparedStatement instruccion = null;
        String evento = "";
        
        try {
            
            instruccion = conexion.prepareStatement(Constantes.SELECCIONA_EVENTO_NOMBRE);
            
            instruccion.setInt(1, idEvento);
            ResultSet result = instruccion.executeQuery();
            
            while (result.next()) {
                evento = result.getString(1);
            }
        } catch (Exception ex) {
            System.out.println(ex);
        } finally {
            
            if (instruccion != null) {
                try {
                    instruccion.close();
                } catch (SQLException sqlEx) {
                } // ignore

                instruccion = null;
            }
        }
        return evento;
    }
    
    public String seleccionaNombreSitio(int idSitio) {
        PreparedStatement instruccion = null;
        String sitio = "";
        
        try {
            
            instruccion = conexion.prepareStatement(Constantes.SELECCIONA_SITIO_NOMBRE);
            
            instruccion.setInt(1, idSitio);
            ResultSet result = instruccion.executeQuery();
            
            while (result.next()) {
                sitio = result.getString(1);
            }
        } catch (Exception ex) {
            System.out.println(ex);
        } finally {
            
            if (instruccion != null) {
                try {
                    instruccion.close();
                } catch (SQLException sqlEx) {
                } // ignore

                instruccion = null;
            }
        }
        return sitio;
    }
    
    public String seleccionaEco(int idEco) {
        PreparedStatement instruccion = null;
        String eco = "";
        
        try {
            
            instruccion = conexion.prepareStatement(Constantes.SELECCIONA_ECO_NOMBRE);
            
            instruccion.setInt(1, idEco);
            ResultSet result = instruccion.executeQuery();
            
            while (result.next()) {
                eco = result.getString(1);
            }
        } catch (Exception ex) {
            System.out.println(ex);
        } finally {
            
            if (instruccion != null) {
                try {
                    instruccion.close();
                } catch (SQLException sqlEx) {
                } // ignore

                instruccion = null;
            }
        }
        return eco;
    }
    
    public String seleccionanombreJugador(int idJugador) {
        PreparedStatement instruccion = null;
        String jugador = "";
        
        try {
            
            instruccion = conexion.prepareStatement(Constantes.SELECCIONA_JUGADOR_NOMBRE);
            
            instruccion.setInt(1, idJugador);
            ResultSet result = instruccion.executeQuery();
            
            while (result.next()) {
                jugador = result.getString(1);
                
            }
        } catch (Exception ex) {
            System.out.println(ex);
        } finally {
            
            if (instruccion != null) {
                try {
                    instruccion.close();
                } catch (SQLException sqlEx) {
                } // ignore

                instruccion = null;
            }
        }
        return jugador;
    }
    
    public int seleccionaElo(int idJugador) {
        PreparedStatement instruccion = null;
        int elo = 0;
        
        try {
            
            instruccion = conexion.prepareStatement(Constantes.SELECCIONA_ELO);
            
            instruccion.setInt(1, idJugador);
            ResultSet result = instruccion.executeQuery();
            
            while (result.next()) {
                elo = result.getInt(1);
                
            }
        } catch (Exception ex) {
            System.out.println(ex);
        } finally {
            
            if (instruccion != null) {
                try {
                    instruccion.close();
                } catch (SQLException sqlEx) {
                } // ignore

                instruccion = null;
            }
        }
        return elo;
    }
    
    public Hits seleccionaMovimientos(int idPartida) {
        Hits hits = new Hits();
        String fichaBlanca = null;
        String fichaNegra = null;
        PreparedStatement instruccion = null;
        
        try {
            
            instruccion = conexion.prepareStatement(Constantes.SELECCIONA_MOVIMIENTOS);
            
            
            instruccion.setInt(1, idPartida);
            System.out.println(instruccion.toString());
            ResultSet result = instruccion.executeQuery();
            
            int cont = 1;
            while (result.next()) {
                
                
                if (result.getString(3).equals("P")) {
                    fichaBlanca = "";
                } else {
                    fichaBlanca = result.getString(3);
                }
                Hit movimiento = new Hit();
                movimiento.setNumber(cont + "");
                String movBlanco = fichaBlanca + result.getString(2);
                if (result.isLast()) {
                    if (result.getString(3).equals("P")) {
                        fichaNegra = "";
                    } else {
                        fichaNegra = result.getString(3);
                    }
                    movimiento.setContent( fichaNegra + result.getString(2));
                }
                if (!result.isLast() & result.next()) {
                    if (result.getString(3).equals("P")) {
                        fichaNegra = "";
                    } else {
                        fichaNegra = result.getString(3);
                    }
                    movimiento.setContent(movBlanco + " " + fichaNegra + result.getString(2));
                }
                hits.addHit(movimiento);
                if (result.getInt(1) % 2 == 0) {
                    cont++;
                }
            }
        } catch (Exception ex) {
            System.out.println(ex);
        } finally {
            
            if (instruccion != null) {
                try {
                    instruccion.close();
                } catch (SQLException sqlEx) {
                } // ignore

                instruccion = null;
            }
        }
        return hits;
    }
}
